package test;

class ListNode {
    int val;
    ListNode next;

    // ListNode 的构造函数
    ListNode(int val) {
        this.val = val;
        this.next = null;
    }
}

// MyLinkedList 类，表示整个链表
class MyLinkedList {
    private int size;
    private ListNode head;

    // 构造函数，初始化链表
    public MyLinkedList() {
        size = 0;                  // 初始化链表大小为0
        head = new ListNode(0);     // 创建一个虚拟头节点，方便操作
    }

    // 获取索引位置的节点的值
    public int get(int index) {
        if (index < 0 || index >= size) {
            return -1;  // 返回 -1 表示索引越界
        }
        ListNode cur = head;
        for (int i = 0; i <= index; i++) {
            cur = cur.next;
        }
        return cur.val;
    }

    // 在链表头部插入一个新节点
    public void addAtHead(int val) {
        addAtIndex(0, val);  // 直接调用 addAtIndex 来处理头部插入
    }

    // 在链表尾部插入一个新节点
    public void addAtTail(int val) {
        addAtIndex(size, val);  // 直接调用 addAtIndex 来处理尾部插入
    }

    // 在指定位置插入一个新节点
    public void addAtIndex(int index, int val) {
        if (index < 0 || index > size) {
            return;  // 索引越界，无操作
        }
        ListNode newNode = new ListNode(val);
        ListNode cur = head;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        newNode.next = cur.next;
        cur.next = newNode;
        size++;  // 插入成功，链表大小增加
    }

    // 删除指定位置的节点
    public void deleteAtIndex(int index) {
        if (index < 0 || index >= size) {
            return;  // 索引越界，无操作
        }

        ListNode cur = head;
        for (int i = 0; i < index; i++) {
            cur = cur.next;
        }
        cur.next = cur.next.next;  // 跳过要删除的节点
        size--;  // 删除成功，链表大小减小
    }
}
